import base64
import numpy as np
import requests
from pydub import AudioSegment  # 处理多格式音频


def convert_audio_to_standard_format(audio_path):
    """
    将任意格式音频转为：16kHz 采样率、单声道、float32 字节流
    """
    # 1. 读取音频（自动识别格式：MP3、WAV、FLAC 等）
    # 根据文件后缀选择读取方式（pydub 需指定格式，或自动推断）
    if audio_path.endswith(".mp3"):
        audio = AudioSegment.from_mp3(audio_path)
    elif audio_path.endswith(".flac"):
        audio = AudioSegment.from_flac(audio_path)
    elif audio_path.endswith(".wav"):
        audio = AudioSegment.from_wav(audio_path)
    else:
        # 自动推断格式（对部分文件可能失效，建议优先指定后缀）
        audio = AudioSegment.from_file(audio_path)

    # 2. 转为 16kHz 采样率、单声道
    audio = audio.set_frame_rate(16000).set_channels(1)

    # 3. 转为 float32 格式（归一化到 [-1.0, 1.0]）
    # pydub 默认是 16bit 整数，先转为 raw 字节流
    raw_audio = audio.raw_data
    # 16bit 整数 → float32，除以 32768 归一化
    audio_float32 = np.frombuffer(raw_audio, dtype=np.int16).astype(np.float32) / 32768.0

    return audio_float32


def test_whisper_api(audio_path, api_url):
    # 1. 自动转换音频格式（兼容 MP3/FLAC/WAV）
    print(f"正在处理音频文件：{audio_path}")
    audio_float32 = convert_audio_to_standard_format(audio_path)

    # 2. 转为 Base64 编码
    audio_bytes = audio_float32.tobytes()
    audio_base64 = base64.b64encode(audio_bytes).decode("utf-8")

    # 3. 发送请求
    request_data = {
        "segment_index": 0,
        "audio_base64": audio_base64,
        "language": "zh"
    }
    print("发送请求到 API...")
    response = requests.post(api_url, json=request_data)
    response.raise_for_status()  # 若请求失败（如 404/500），直接抛出错误

    # 4. 打印结果
    result = response.json()
    print("\n✅ API 响应成功：")
    print(f"片段索引：{result['segment_index']}")
    print(f"转录文本：{result['text']}")
    return result

